En omfattende guide til distribution af Python-pakker via PyPI, der dækker bedste praksis for versionsstyring, værktøjer og arbejdsgange for globale udviklere.
Distribution af Python-pakker: Udgivelse pĂĄ PyPI og Versionsstyring
Pythons omfattende økosystem er drevet af en enorm samling af pakker, der er let tilgængelige via Python Package Index (PyPI). Denne guide giver en omfattende oversigt over, hvordan du distribuerer dine egne Python-pakker via PyPI, så de er tilgængelige for udviklere over hele verden. Vi vil udforske de essentielle værktøjer, bedste praksis for versionsstyring og arbejdsgange for at skabe og udgive Python-pakker af høj kvalitet.
Hvorfor distribuere din Python-pakke?
At distribuere din Python-pakke giver mange fordele:
- Deling af dit arbejde: Giver andre udviklere mulighed for nemt at genbruge din kode, hvilket fremmer samarbejde og innovation. Forestil dig et globalt team, der bruger dine specialiserede dataanalyseværktøjer bygget i Python.
- Afhængighedsstyring: Forenkler processen med at administrere afhængigheder i andre projekter. Din pakke kan installeres med en enkelt kommando sammen med alle dens afhængigheder.
- Bidrag til open source: Giver dig mulighed for at bidrage til open source-fællesskabet og opnå anerkendelse for dit arbejde. Mange kritiske softwarekomponenter er open source-pakker, der vedligeholdes af udviklere over hele verden.
- Versionskontrol og opdateringer: Giver en struktureret mĂĄde at administrere versioner, udgive opdateringer og rette fejl. Dette sikrer, at brugerne altid har adgang til den nyeste og mest pĂĄlidelige version af din pakke.
- Nem installation: Forenkler installationen for brugere via `pip install dit-pakkenavn`.
Essentielle værktøjer til distribution af Python-pakker
Flere værktøjer er essentielle for at skabe og distribuere Python-pakker:
- setuptools: Et meget anvendt bibliotek til at definere pakkemetadata, herunder navn, version, afhængigheder og indgangspunkter. Det er de facto-standarden for pakning af Python-projekter.
- wheel: Et distributionsformat, der giver en mere effektiv og pålidelig installationsproces sammenlignet med kildedistributioner. Wheels er forudbyggede distributioner, der kan installeres uden at kræve kompilering.
- twine: Et værktøj til sikker upload af din pakke til PyPI. Twine krypterer dine legitimationsoplysninger og pakkedata under transmission, hvilket beskytter mod aflytning og man-in-the-middle-angreb.
- venv/virtualenv: Disse er værktøjer til at skabe isolerede Python-miljøer. Det er afgørende at bruge virtuelle miljøer til at administrere afhængigheder og undgå konflikter mellem forskellige projekter.
Opsætning af dit projekt
Før du kan distribuere din pakke, skal du strukturere dit projekt korrekt.
Eksempel pĂĄ projektstruktur
my_package/ ├── my_package/ │ ├── __init__.py │ ├── module1.py │ └── module2.py ├── tests/ │ ├── __init__.py │ ├── test_module1.py │ └── test_module2.py ├── README.md ├── LICENSE ├── setup.py └── .gitignore
Forklaring:
- my_package/: Hovedmappen, der indeholder din pakkes kildekode.
- my_package/__init__.py: Gør `my_package`-mappen til en Python-pakke. Den kan være tom или indeholde initialiseringskode.
- my_package/module1.py, my_package/module2.py: Dine Python-moduler, der indeholder den faktiske kode.
- tests/: En mappe, der indeholder dine enhedstests. Det er afgørende at skrive tests for at sikre kvaliteten og pålideligheden af din pakke.
- README.md: En Markdown-fil, der giver en beskrivelse af din pakke, brugsanvisning og anden relevant information. Dette er ofte det første, brugerne ser på PyPI.
- LICENSE: En fil, der indeholder licensen, som din pakke distribueres under (f.eks. MIT, Apache 2.0, GPL). At vælge en passende licens er afgørende for at specificere, hvordan andre kan bruge din kode.
- setup.py: Hovedkonfigurationsfilen, der definerer din pakkes metadata og byggeinstruktioner.
- .gitignore: Specificerer filer og mapper, der skal ignoreres af Git (f.eks. midlertidige filer, byggeartefakter).
Oprettelse af `setup.py`-filen
`setup.py`-filen er hjertet i din pakkedistribution. Den indeholder metadata om din pakke og instruktioner til at bygge og installere den. Her er et eksempel:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="my_package", # Erstat med dit pakkenavn
version="0.1.0",
author="Dit Navn", # Erstat med dit navn
author_email="din.email@eksempel.com", # Erstat med din e-mail
description="En lille eksempelpakke",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/ditbrugernavn/my_package", # Erstat med URL'en til dit repository
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[
"requests", # Eksempel på afhængighed
],
)
Forklaring:
- name: Navnet på din pakke, som vil blive brugt på PyPI. Vælg et unikt og beskrivende navn.
- version: Versionsnummeret på din pakke. Følg semantisk versionering (se nedenfor).
- author, author_email: Dit navn og din e-mailadresse.
- description: En kort beskrivelse af din pakke.
- long_description: En længere, mere detaljeret beskrivelse, typisk læst fra din `README.md`-fil.
- long_description_content_type: Specificerer formatet af din lange beskrivelse (f.eks. "text/markdown").
- url: URL'en til din pakkes hjemmeside (f.eks. GitHub-repository).
- packages: En liste over pakker, der skal inkluderes i din distribution. `setuptools.find_packages()` finder automatisk alle pakker i dit projekt.
- classifiers: Metadata, der hjælper brugere med at finde din pakke på PyPI. Vælg passende klassificeringer fra listen over Trove Classifiers. Overvej at inkludere klassificeringer for understøttede Python-versioner, operativsystemer og licenser.
- python_requires: Specificerer den mindste Python-version, der kræves for at bruge din pakke.
- install_requires: En liste over afhængigheder, som din pakke kræver. Disse afhængigheder vil automatisk blive installeret, når din pakke installeres.
Versionsstyring: Semantisk Versionering
Semantisk Versionering (SemVer) er et udbredt versioneringsskema, der giver en klar og konsistent måde at kommunikere arten af ændringer i din pakke.
Et SemVer-versionsnummer bestĂĄr af tre dele: MAJOR.MINOR.PATCH.
- MAJOR: Forøges, når du foretager inkompatible API-ændringer. Dette indikerer en betydelig ændring, der kan kræve, at brugerne opdaterer deres kode.
- MINOR: Forøges, når du tilføjer funktionalitet på en bagudkompatibel måde. Dette betyder nye funktioner eller forbedringer, der ikke ødelægger eksisterende kode.
- PATCH: Forøges, når du laver bagudkompatible fejlrettelser. Dette er for små rettelser, der ikke tilføjer nye funktioner eller ødelægger eksisterende funktionalitet.
Eksempler:
- 1.0.0: Første udgivelse.
- 1.1.0: Tilføjet en ny funktion uden at ødelægge eksisterende kode.
- 1.0.1: Rettet en fejl i 1.0.0-udgivelsen.
- 2.0.0: Foretaget inkompatible API-ændringer.
Brug af SemVer hjælper brugere med at forstå virkningen af at opgradere til en ny version af din pakke.
Bygning af din pakke
NĂĄr du har konfigureret din `setup.py`-fil, kan du bygge din pakke.
- Opret et virtuelt miljø: Det anbefales stærkt at oprette et virtuelt miljø for at isolere din pakkes afhængigheder. Brug `python3 -m venv .venv` (eller `virtualenv .venv`) og aktiver det derefter (`source .venv/bin/activate` på Linux/macOS, `.venv\Scripts\activate` på Windows).
- Installer byggeafhængigheder: Kør `pip install --upgrade setuptools wheel`.
- Byg pakken: Kør `python setup.py sdist bdist_wheel`. Denne kommando opretter to distributionsfiler i `dist`-mappen: en kildedistribution (sdist) og en wheel-distribution (bdist_wheel).
`sdist`-filen indeholder din kildekode og `setup.py`-fil. `bdist_wheel` er en forudbygget distribution, der kan installeres hurtigere.
Udgivelse af din pakke pĂĄ PyPI
Før du kan udgive din pakke, skal du oprette en konto på PyPI (https://pypi.org/) og oprette et API-token. Dette token vil blive brugt til at godkende dine uploads.
- Registrer dig pĂĄ PyPI: GĂĄ til https://pypi.org/account/register/ og opret en konto.
- Opret et API-token: GĂĄ til https://pypi.org/manage/account/, rul ned til sektionen "API tokens", og opret et nyt token. Opbevar dette token sikkert, da du skal bruge det til at uploade din pakke.
- Installer Twine: Kør `pip install twine`.
- Upload din pakke: Kør `twine upload dist/*`. Du vil blive bedt om dit brugernavn (
__token__) og din adgangskode (det API-token, du oprettede).
Vigtig sikkerhedsanvisning: Commit aldrig dit API-token til dit repository. Opbevar det sikkert og brug miljøvariabler eller andre sikre metoder til at få adgang til det under upload-processen.
Test af din pakkeinstallation
Efter at have udgivet din pakke er det vigtigt at teste, at den kan installeres korrekt.
- Opret et nyt virtuelt miljø: Dette sikrer, at du tester installationen i et rent miljø.
- Installer din pakke: Kør `pip install dit-pakkenavn`.
- Importer og brug din pakke: I en Python-fortolker skal du importere din pakke og bekræfte, at den fungerer som forventet.
Kontinuerlig Integration og Kontinuerlig Udrulning (CI/CD)
For at automatisere processen med at bygge, teste og udgive din pakke kan du bruge CI/CD-værktøjer som GitHub Actions, GitLab CI eller Travis CI.
Her er et eksempel pĂĄ en GitHub Actions-arbejdsgang, der bygger og udgiver din pakke til PyPI:
name: Udgiv til PyPI
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package
run: python setup.py sdist bdist_wheel
- name: Publish package to PyPI
run: |
twine upload dist/* \
-u __token__ \
-p ${{ secrets.PYPI_API_TOKEN }}
Forklaring:
- Denne arbejdsgang udløses, når en ny udgivelse publiceres på GitHub.
- Den henter koden, opsætter Python, installerer afhængigheder, bygger pakken og uploader den til PyPI.
secrets.PYPI_API_TOKENer en GitHub-hemmelighed, der gemmer dit PyPI API-token. Du skal konfigurere denne hemmelighed i indstillingerne for dit GitHub-repository.
Bedste praksis for distribution af Python-pakker
- Skriv omfattende dokumentation: Inkluder en detaljeret `README.md`-fil samt API-dokumentation ved hjælp af værktøjer som Sphinx. Klar og fuldstændig dokumentation er afgørende for at gøre din pakke let at bruge.
- Skriv enhedstests: Test din kode grundigt for at sikre dens kvalitet og pĂĄlidelighed. Brug et test-framework som pytest eller unittest.
- Følg PEP 8-stilretningslinjerne: Overhold Python Enhancement Proposal 8 (PEP 8)-stilguiden for at sikre konsistent og læsbar kode.
- Brug en licens: Vælg en passende open source-licens for at specificere, hvordan andre kan bruge din kode.
- Hold dine afhængigheder opdaterede: Opdater regelmæssigt din pakkes afhængigheder for at drage fordel af fejlrettelser, sikkerhedsrettelser og nye funktioner.
- Brug et virtuelt miljø: Udvikl og test altid din pakke i et virtuelt miljø for at isolere afhængigheder.
- Overvej internationalisering (i18n) og lokalisering (l10n): Hvis din pakke håndterer brugerrettet tekst eller data, så overvej at gøre den tilpasselig til forskellige sprog og regioner. Dette udvider din potentielle brugerbase globalt. Værktøjer som Babel kan hjælpe med dette.
- Håndter forskellige tidszoner og valutaer: Hvis din pakke arbejder med datoer, tider eller finansielle transaktioner, skal du være opmærksom på forskellige tidszoner og valutaer rundt om i verden. Brug passende biblioteker og API'er til at håndtere disse kompleksiteter korrekt.
- Giv klare fejlmeddelelser: Skriv informative fejlmeddelelser, der hjælper brugerne med at forstå, hvad der gik galt, og hvordan de kan rette det. Oversæt disse fejlmeddelelser til forskellige sprog, hvis det er muligt.
- Tænk på tilgængelighed: Overvej brugere med handicap, når du designer din pakkes grænseflade og dokumentation. Følg retningslinjer for tilgængelighed for at sikre, at din pakke kan bruges af alle.
Avancerede emner
- Navnerumspakker: Giver dig mulighed for at opdele en enkelt Python-pakke på tværs af flere mapper eller endda flere distributioner.
- Indgangspunkter: Giver dig mulighed for at definere funktioner eller klasser, der kan kaldes fra andre pakker eller fra kommandolinjen.
- Datafiler: Giver dig mulighed for at inkludere ikke-Python-filer (f.eks. datafiler, konfigurationsfiler) i din distribution.
- Betingede afhængigheder: Giver dig mulighed for at specificere afhængigheder, der kun er påkrævet under visse betingelser (f.eks. på et bestemt operativsystem).
Konklusion
At distribuere din Python-pakke på PyPI er en fantastisk måde at dele dit arbejde med verden og bidrage til Python-økosystemet. Ved at følge trinene og de bedste praksisser, der er beskrevet i denne guide, kan du oprette og udgive Python-pakker af høj kvalitet, der er nemme at installere, bruge og vedligeholde. Husk at prioritere klar dokumentation, grundig testning og konsekvent versionsstyring for at sikre din pakkes succes.